#include "debug.h"
#include "bsp.h"
#include "bsp_bc26.h"
#include "bsp_led.h"

#include "bsp_usb.h"
#include "bsp_rs485.h"
#include "bsp_meter.h"

char sendP[255]={0};	
/***********************************************************************************************************
函数名称 ： main
功    能 ： 主函数
参    数 ： 无
返 回 值 ： 无
作    者 ： FlySnail
***********************************************************************************************************/
int main(void)
{ 	 
	int8_t sendFailCount = 0;		// 累计发送失败次数
	SYS_Init(); 	 							// 外设初始化
	paramStructInit();					// 全局参数初始化
	
	printf("init\r\n");
	while(1)
	{
		// USB交互--------------
		USB_FUNCTION();
		RS485_Handle();
		
		// 6s获取一次，实际不需要怎么快
		if(sys_ms - RS485_Structure.send_time>RS485_TIME_OUT*2)
		{
				if(METER_GetComEnergy(0)!=SUCCESS)
				{	
					printf("RS485 is timeout,dev cheack?\r\n");
					NVIC_SystemReset();
				}
				else{
					printf("Energy: %s   dataSendInterval:%d   sendInterval:%d\r\n",sendP,dataSendInterval,sendInterval*1000);
				}
		}
	
		
		// 如果485超过5次超时，
		if(RS485_Structure.errCount>5)
		{
			printf("RS485 is timeout,dev cheack?\r\n");
			NVIC_SystemReset();
		}

		
		// 到了间隔时间就上传数据,并且初始化是成功的,
		if(bc26.initStat == INIT_SUCCESS || bc26.initStat==INNET_OK || bc26.initStat==INNET_ERR)
		{
				if(dataSendInterval>=sendInterval*1000) // 秒转毫秒  SendInterval=600
				{
						dataSendInterval = 0;
					
						memset(sendP,0 , sizeof(sendP));
						sprintf((char *)sendP,(char *)("{\"pointCode\":\"%s\",\"energy\":\"%0.2f\"}"), USB.Address_number+1, meter.CombinationEnergy.energy);
						// 发送数据，事先已经准备好了
						if(BC26_UploadDataWithoutRes((uint8_t *)sendP,strlen(sendP)) != SUCCESS)
						{
							bc26.initStat = INNET_ERR;
							dataSendInterval = sendInterval*1000;  // 如果发送失败，再重新连接发送
							sendFailCount++;
							if(sendFailCount>10)  // 超过10次没发送成功就重启系统
							{
								NVIC_SystemReset();
							}						
						}
						else{
							bc26.initStat = INNET_OK;
						}
				}
		}
		
		// LED错误提示
		BC26_StatShow(bc26.initStat);	
	}
}

